package main.java.aplicacion.juegos.entidades;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

import main.java.aplicacion.categorias.entidades.Categoria;
import main.java.aplicacion.comentarios.entidades.Comentario;
import main.java.aplicacion.usuarios.entidades.Desarrollador;
import main.java.datatypes.comentarios.ComentarioVO;
import main.java.datatypes.juegos.CompraJuegoVO;
import main.java.datatypes.juegos.CompraVO;
import main.java.datatypes.juegos.JuegoVO;
import main.java.datatypes.juegos.VersionVO;

public class Juego {

	private String nombre;
	private String descripcion;
	private double tamano;
	private int numero;
	private double precio;
	private List<Categoria> categorias;
	private Desarrollador desarrollador;
	private List<Comentario> comentarios;
	private List<Compra> compras;
	private List<Version> versiones;
	private Version ultAprobada;

	public Juego(String nombre, String descripcion, double tam, double p) {
		this.nombre = nombre;
		this.descripcion = descripcion;
		this.tamano = tam;
		this.precio = p;
		//this.categorias = new ArrayList<Categoria>();
		//this.comentarios = new ArrayList<Comentario>();
		//this.compras = new ArrayList<Compra>();
		this.versiones = new ArrayList<Version>();
	}

	public Juego(JuegoVO dtJuego) {
		this.nombre = dtJuego.getNombre();
		this.descripcion = dtJuego.getDescripcion();
		this.tamano = dtJuego.getTamano();
		this.numero = dtJuego.getNumero();
		this.precio = dtJuego.getPrecio();
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public double getTamano() {
		return tamano;
	}

	public void setTamano(double tamano) {
		this.tamano = tamano;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	public double getPrecio() {
		return precio;
	}

	public void setPrecio(double precio) {
		this.precio = precio;
	}

	public List<Categoria> getCategorias() {
		return categorias;
	}

	public void setCategorias(List<Categoria> categorias) {
		this.categorias = categorias;
	}

	public void setDesarrollador(Desarrollador desarrollador) {
		this.desarrollador = desarrollador;
	}

	public Desarrollador getDesarrollador() {
		return desarrollador;
	}

	public void setComentarios(List<Comentario> comentarios) {
		this.comentarios = comentarios;
	}

	public List<Comentario> getComentarios() {
		return comentarios;
	}

	public void setCompras(List<Compra> compras) {
		this.compras = compras;
	}

	public List<Compra> getCompras() {
		return compras;
	}
	
	public Version getUltAprobada() {
		return ultAprobada;
	}

	public void setUltAprobada(Version ultAprobada) {
		this.ultAprobada = ultAprobada;
	}

	public List<Version> getVersiones() {
		return versiones;
	}

	public void setVersiones(List<Version> versiones) {
		this.versiones = versiones;
	}

	public JuegoVO getJuegoVO() {
		JuegoVO j = new JuegoVO(this.nombre, this.descripcion, this.tamano, this.precio);
		j.setDesarrollador(this.desarrollador.getNick());
		j.setNumero(this.numero);
		if(this.categorias != null){
			List<String> cat = new ArrayList<String>();
			ListIterator<Categoria> it = this.categorias.listIterator();
			while(it.hasNext()){
				cat.add(it.next().getNombre());
			}
			j.setCategorias(cat);
		}
		if(this.comentarios != null){
			List<ComentarioVO> com = new ArrayList<ComentarioVO>();
			ListIterator<Comentario> lit = this.comentarios.listIterator();
			while(lit.hasNext()){
				com.add(lit.next().getComentarioVO());
			}
			j.setComentarios(com);
		}
		if(this.compras!= null){
			List<CompraVO> com = new ArrayList<CompraVO>();
			ListIterator<Compra> lit = this.compras.listIterator();
			while(lit.hasNext()){
				Compra c = lit.next();
				com.add(new CompraVO(this.nombre, c.getCliente().getNick(), this.getPrecio(),c.getFecha()));
			}
			j.setCompradores(com);
		}
		if(this.versiones!= null){
			//List<VersionVO> com = new ArrayList<CompraVO>();
			ListIterator<Version> lit = this.versiones.listIterator();
			while(lit.hasNext()){
				Version v = lit.next();
				j.getVersiones().add(new VersionVO(v.getNumero(), this.nombre, this.desarrollador.getNick(), v.getDirVersion(), v.getTamanio(), v.getEstado().getNombre(), v.getEstado().getMotivo()));
				if (Aprobado.class.isInstance(v.getEstado()))
					j.getVersionesAprobadas().add(new VersionVO(v.getNumero(), this.nombre, this.desarrollador.getNick(), v.getDirVersion(), v.getTamanio(), v.getEstado().getNombre(), v.getEstado().getMotivo()));
			}
			
		}
		
		if(this.ultAprobada != null){
			j.setUltAprobada(new VersionVO(this.ultAprobada.getNumero(), this.nombre, this.desarrollador.getNick(), this.ultAprobada.getDirVersion(), this.ultAprobada.getTamanio(), this.ultAprobada.getEstado().getNombre(), this.ultAprobada.getEstado().getMotivo()));
		}
		return j;
	}

	public CompraJuegoVO getCompraJuegoVO() {
		return new CompraJuegoVO(this.nombre, this.descripcion, this.precio);
	}
	
	public void registrarComentario(Comentario c){
		
		if(this.comentarios == null) this.comentarios = new ArrayList<Comentario>();
		this.comentarios.add(c);
	}

	public void addCompraJuego(Compra c) {
		if(this.compras == null)
			this.compras = new ArrayList<Compra>();
		this.compras.add(c);
		
	}
	
	public List<Version> getVersionesPendientes(){
		List<Version> vp = new ArrayList<Version>();
		if ((this.versiones!=null)){
			for(Version v: this.versiones){
				if(Pendiente.class.isInstance(v.getEstado())){
					vp.add(v);
				}
			}
		}
		return vp;
	}
	
	public VersionVO getVersionVO(Version v)
	{
		VersionVO vvo = new VersionVO(v.getNumero(), this.getNombre(), this.getDesarrollador().getNick(), v.getDirVersion(), v.getTamanio(), v.getEstado().getNombre(), v.getEstado().getMotivo());
		return vvo;
	}
	
	public List<VersionVO> getVersionesAprobadas(){
		List<VersionVO> vp = new ArrayList<VersionVO>();
		for(Version v: this.versiones){
			if(Aprobado.class.isInstance(v.getEstado())){
				vp.add(this.getVersionVO(v));
			}
		}
		return vp;
	}
}
